從 Day9 的 List 串列 開始,我們一路上已經認識了集合型態家族的三位成員:
每一種都有它最擅長的場景。
而今天呢,終於輪到壓軸角色登場—— Dictionary 字典 (dict)。
字典就像一張「資料對照表」,
可以讓我們用 名字 (key) 直接找到對應的 內容 (value)。
比起 List 要靠索引位置,dict 的操作更直覺,也更常出現在真實專案裡。
比如說:
這些場合,list 或 set 就顯得不太適合,因為我們需要的不是「順序」,
而是 查詢對應關係。
而這,就是 dict 的主場!一起往下看吧!
如果說:
那麼 Dictionary (字典) 就是 「一個可以透過名字找到東西的對照表」。
它的形式是 key → value (鍵值對):{key:value}
key
:像名字、編號、代號,必須唯一且不可變value
:實際的資料,可以是任何型態Python 用 大括號 {}
來表示字典。
student = {
"id": "S001",
"name": "Alice",
"age": 18,
"courses": ["Python", "Math"]
}
print("學生姓名:",student["name"])
print("課堂名稱:",student["courses"])
輸出:
學生姓名: Alice
課堂名稱: ['Python', 'Math']
這邊也可以試試看列印出「年齡」、「id」。(可以自己先試試看!)
print("學生ID:",student["id"])
print("學生年齡:",student["age"])
想像一下,如果用 List 儲存學生資料:
student = ["S001", "Alice", 18, ["Python", "Math"]]
student[1]
student[2]
這樣太難記了!如果資料結構變動,索引位置就全亂。
更何況如果資料量非常大(上萬筆),應該不可能這樣去數索引~
這時候字典就出場了:用「名字」找資料,比用「位置」更直覺。
person = {"name": "Bob", "age": 20}
print(person)
輸出:
也可以用 dict()
:
person = dict(name="Bob", age=20)
print(person["name"]) # Bob
輸出:
⚠️ 這邊要注意一下!如果 key 不存在會報錯喔!(keyError)
這邊舉個例子:(假設要取不存在key的value)
person["gender"] = "Male" # 新增
person["age"] = 21 # 修改
輸出:
del person["age"]
gender = person.pop("gender") # 回傳刪掉的值
輸出:
student = {"id": "S001", "name": "Alice", "age": 18}
for key, value in student.items():
print(key, ":", value)
輸出:
print(student.keys()) # dict_keys(['id', 'name', 'age'])
print(student.values()) # dict_values(['S001', 'Alice', 18])
print(student.items()) # dict_items([('id', 'S001'), ('name', 'Alice'), ('age', 18)])
型態 | 語法 | 特性 | 適用場合 |
---|---|---|---|
List | [] |
有序,可變,可重複 | 任務清單、動態資料 |
Tuple | () |
有序,不可變,可重複 | 固定不變的資料 (生日、座標) |
Set | {} |
無序,不可重複 | 去重、集合運算 |
Dict | {key:value} |
無序,key 唯一,value 可重複 | 快速查詢、描述結構化資料 |
tickets = {
"A1": "空位",
"A2": "空位",
"A3": "空位"
}
while True:
# 檢查是否還有空位
if "空位" not in tickets.values():
print("❌ 沒有座位了,所有位置都被訂走了!")
break
seat = input("請選擇座位(A1~A3, 輸入 q 離開):")
if seat == "q":
break
elif tickets.get(seat) == "已售出":
print("⚠️ 這個位置已經有人訂囉!")
elif tickets.get(seat) == "空位":
tickets[seat] = "已售出"
print(f"✅ {seat} 訂票成功!")
else:
print("⚠️ 無效座位")
print("\n📋 最終座位狀態:", tickets)
來稍做說明這個範例的一些程式邏輯!:
tickets
字典記錄每個座位的狀態("空位" / "已售出")。q
離開。q
跳出;輸入無效座位則提示。if "空位" not in tickets.values()
判斷輸出:
menu = {
"漢堡": 50,
"薯條": 30,
"可樂": 20,
"炸雞": 70,
"沙拉": 40,
"奶茶": 35,
"熱狗": 25,
"冰淇淋": 45
}
print("=====公告:今天是IThome鐵人賽第18天=====")
print("🍴 歡迎光臨!以下是菜單:")
for item, price in menu.items():
print(f"{item}:{price} 元")
order = []
while True:
choice = input("請輸入要點的餐點(輸入 q 結束):")
if choice == "q":
break
if choice not in menu:
print("⚠️ 沒有這個餐點喔,請重新輸入!")
continue
order.append(choice)
print(f"✅ 已加入 {choice}")
# 計算總金額
total = sum(menu[item] for item in order)
print("\n📋 您的點餐清單:", order)
print("💰 總金額:", total, "元")
這邊我會來統整一下我用到的語法以及原因:
"漢堡"
)50
)menu["漢堡"]
就能拿到 50)。while True
搭配 break
→ 讓流程持續,直到使用者輸入 q
才結束。continue
會跳過這次的迴圈,不會往下執行!order
來存放使用者的點餐紀錄。order
裡。sum()
搭配 生成式 (generator expression),把點的每個餐點對應的價格加總起來。menu[item]
會從字典中找到該餐點的價格。輸出:
# 建立藥品與副作用字典
medicines = {
"普拿疼": "可能會引起肝臟負擔、噁心",
"阿莫西林": "可能會導致腹瀉、過敏反應",
"阿斯匹靈": "可能造成胃部不適、出血風險",
"抗組織胺": "可能會嗜睡、口乾",
"類固醇": "可能引起水腫、免疫力下降"
}
print("====藥品副作用查詢系統====")
print("可查詢的藥品有:", ", ".join(medicines.keys()))
while True:
drug = input("\n請輸入藥品名稱(輸入 q 離開):")
if drug == "q":
print("結束查詢!")
break
if drug not in medicines:
print("⚠️ 查無此藥品,請重新輸入!")
continue
print(f"✅ {drug} 的副作用:{medicines[drug]}")
輸出:
這邊會先利用字典建立學生以及成績,
再讓使用者輸入想查詢的學生姓名,
若存在於字典,就會以字典取值的方式將學生的成績輸出。
不存在的話就print查無此人,請重新輸入!
scores={"Sharon":100,"John":77,"Daniel":50}
search = input("請輸入想查詢的學生姓名:")
if search in scores:
print(search,"的成績是",scores[search])
else:
print("請重新輸入,查無此人!!")
輸出:
這邊整理出我自己當初在學字典這部分的時候很常搞錯或是忽略的重點:
錯誤示範:
menu = {"漢堡": 50, "薯條": 30}
if 50 in menu:
print("有 50 元的餐點")
else:
print("沒有")
輸出:
沒有
正確寫法應該是:
if 50 in menu.values():
print("有 50 元的餐點")
輸出:
有 50 元的餐點
錯誤示範:
bad_menu = {["漢堡", "薯條"]: 100}
輸出:
TypeError: unhashable type: 'list'
正確寫法:(用Tuple當key)
good_menu = {("漢堡", "薯條"): 100}
錯誤示範:
menu = {"漢堡": 50, "薯條": 30}
for item in menu:
print(item)
輸出
漢堡
薯條
正確寫法
for key, value in menu.items():
print(key, "價格:", value)
輸出:
透過字典(dict
)建立身分證字母對應的出生地,並從身分證號解析出性別與出生地。
練習字典查詢、條件判斷與使用者輸入驗證。
# 身分證字母對應出生地字典
places = {
'A': '臺北市', 'B': '台中市','C': '基隆市','D': '台南市','E': '高雄市',
'F': '新北市','G': '宜蘭縣', 'H': '桃園市','I': '嘉義市','J': '新竹縣',
'K': '苗栗縣','L': '台中縣','M': '南投縣','N': '彰化縣','O': '新竹市',
'P': '雲林縣', 'Q': '嘉義縣','R': '台南縣','S': '高雄縣','T': '屏東縣',
'U': '花蓮縣','V': '台東縣', 'W': '金門縣','X': '澎湖縣','Y': '陽明市',
'Z': '連江縣'
}
# 使用者輸入身分證號
pid = input("請輸入身分證字號:")
# 解析性別
gender = int(pid[1])
# 解析出生地
birth = pid[0].upper() # 確保字母是大寫
# 性別判斷
if gender == 1:
print('先生您好!')
elif gender == 2:
print('小姐您好!')
else:
print("⚠️ 請輸入正確的身分證字號,無法辨識性別!")
# 出生地判斷
if birth in places:
print('出生地:', places[birth])
else:
print("⚠️ 查無出生地,請確認身分證字號")
輸出:
places[birth]
直接查詢對應的出生地birth in places
用來檢查輸入的字母是否存在,避免 KeyErrorif-elif-else
用於性別判斷與錯誤提示pid[0].upper()
→ 無論輸入小寫或大寫都能正確查找到這裡,我們已經完整走過了 Python 集合型態的四大主角:
如果要用一句話來總結:
當你想要「用名字找東西」的時候,就該想到 dict。
我們今天也寫了不少範例對吧!!真是辛苦你們了~
(像是:選位系統、點餐系統、副作用查詢、學生成績查詢、身分證解析器)
這些也告訴我們,字典不只是課本裡的概念,而是真正在專案、
甚至日常生活中都能派上用場的工具。
學會了字典,你就掌握了 Python 中 最靈活、最常見的資料結構。
接下來,我們就能開始把四大集合型態組合起來,打造更進階的程式邏輯!!
那麼我們就明天見囉!辛苦啦~